Flatpages(简单页面)
尽管通常情况下总是搭建运行数据库驱动的 Web 应用,有时你还是需要添加一两张一次性的静态页面,例如“关于”页面,或者“隐私策略”页面等等。可以用像 Apache 这样的标准Web服务器来处理这些静态页面,但却会给应用带来一些额外的复杂性,因为你必须操心怎么配置 Apache,还要设置权限让整个团队可以修改编辑这些文件,而且你还不能使用 Django 模板系统来统一这些页面的风格。
这个问题的解决方案是使用位于 django.contrib.flatpages
开发包中的 Django 简单页面(flatpages)应用程序。该应用让你能够通过 Django管理站点来管理这些一次性的页面,还可以让你使用 Django模板系统指定它们使用哪个模板。它在后台使用Django模型,这意味着它把页面项别的数据一样保存在数据库中,也就是说你可以使用标准Django数据库API来存取页面。
简单页面以它们的 URL 和站点为键值。当创建简单页面时,你指定它与哪个URL以及和哪个站点相关联 。(有关站点的更多信息,请查阅”多站点“一节。)
使用简单页面
安装简单页面应用程序必须按照下面的步骤:
- 添加
'django.contrib.flatpages'
到INSTALLED_APPS
设置。django.contrib.flatpages
依赖django.contrib.sites
,所以确保它们都在INSTALLED_APPS
里。 - 将
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
添加到MIDDLEWARE_CLASSES
设置中。 - 运行
manage.py syncdb
命令在数据库中创建必需的两个表。
简单页面应用程序在数据库中创建两个表: django_flatpage
和 django_flatpage_sites
。django_flatpage
只是将 URL 映射到标题和一段文本内容。django_flatpage_sites
是一个多对多表,用于关联某个简单页面以及一个或多个站点。
该应用捆绑的 FlatPage
模型在 django/contrib/flatpages/models.py
进行定义,如下所示:
from django.db import models
from django.contrib.sites.models import Site
class FlatPage(models.Model):
url = models.CharField(max_length=100, db_index=True)
title = models.CharField(max_length=200)
content = models.TextField(blank=True)
enable_comments = models.BooleanField()
template_name = models.CharField(max_length=70, blank=True)
registration_required = models.BooleanField()
sites = models.ManyToManyField(Site)
让我们逐项看看这些字段的含义:
url
: 该简单页面所处的 URL,不包括域名,但是包含前导斜杠 (例如/about/contact/
)。title
: 简单页面的标题。 框架不对它作任何特殊处理。 由你通过模板来显示它。content
: 简单页面的内容 (即 HTML 页面)。 框架不对它作任何特殊处理。由你负责使用模板来显示。enable_comments
:是否允许该简单页面使用评论。框架不对它作任何特殊处理。你可在模板中检查该值并根据需要显示评论窗体。template_name
:用来解析该简单页面的模板名称。这是一个可选项;如果未指定模板或该模板不存在,系统会退而使用默认模板flatpages/default.html
。registration_required
:是否注册用户才能查看此简单页面。 该设置项集成了 Djangos 验证/用户框架,该框架于第十四章详述。sites
:该简单页面放置的站点。该项设置集成了 Django 多站点框架,该框架在本章的“多站点”一节中有所阐述。
你可以通过 Django 超级管理界面或者 Django 数据库 API 来创建简单页面。 要了解更多内容,请查阅“添加、修改和删除简单页面”一节。
一旦简单页面创建完成, FlatpageFallbackMiddleware
将完成(剩下)所有的工作。 每当 Django 引发 404 错误,作为最后的办法,该中间件将根据所请求的 URL 检查简单页面数据库。 确切地说,它将使用所指定的 URL以及 SITE_ID
设置对应的站点 ID 查找一个简单页面。
如果找到一个匹配项,它将载入该简单页面的模板(如果没有指定的话,将使用默认模板 flatpages/default.html
)。同时,它把一个简单的上下文变量flatpage
(一个简单页面对象)传递给模板。模板解析过程中,它实际用的是RequestContext
。
如果 FlatpageFallbackMiddleware
没有找到匹配项,该请求继续如常处理。
注意
该中间件仅在发生 404 (页面未找到)错误时被激活,而不会在 500 (服务器错误)或其他错误响应时被激活。 还要注意的是必须考虑 MIDDLEWARE_CLASSES
的顺序问题。 通常,你可以把 FlatpageFallbackMiddleware
放在列表最后,因为它是最后的办法。
添加、修改和删除简单页面
可以用两种方式增加、变更或删除简单页面:
1、通过超级管理界面 如果已经激活了自动的 Django 超级管理界面,你将会在超级管理页面的首页看到有个 Flatpages 区域。你可以像编辑系统中其它对象那样编辑简单页面。
2、通过 Python API
前面已经提到,简单页面表现为 django/contrib/flatpages/models.py
中的标准 Django 模型。这样,你就可以使用Django数据库API来存取简单页面对象,例如:
>>> from django.contrib.flatpages.models import FlatPage
>>> from django.contrib.sites.models import Site
>>> fp = FlatPage.objects.create(
... url='/about/',
... title='About',
... content='<p>About this site...</p>',
... enable_comments=False,
... template_name='',
... registration_required=False,
... )
>>> fp.sites.add(Site.objects.get(id=1))
>>> FlatPage.objects.get(url='/about/')
<FlatPage: /about/ -- About>
使用简单页面模板
缺省情况下,系统使用模板 flatpages/default.html
来解析简单页面,但你也可以通过设定 FlatPage
对象的 template_name
字段来更改特定简单页面的模板。
你必须自己创建 flatpages/default.html
模板。 只需要在模板目录创建一个 flatpages
目录,并把 default.html
文件置于其中。
简单页面模板只接受有一个上下文变量—— flatpage
,也就是该简单页面对象。
以下是一个 flatpages/default.html
模板范例:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content|safe }}
</body>
</html>
注意我们使用了safe模板过滤器来允许flatpage.content
引入原始HTML而不必转义。
{$ activeFileHint $}